home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_11_12 / winroth / exc_err.h < prev    next >
Encoding:
C/C++ Source or Header  |  1993-10-20  |  8.8 KB  |  331 lines

  1. /*
  2. ** Exception Library -- General exception handling for ANSI C programs
  3. ** 
  4. ** Copyright (C) 1992 Computational Vision and Active Perception Lab. (CVAP),
  5. **                    Royal Institute of Technology, Stockholm.
  6. **
  7. ** This library is free software; you can redistribute it and/or
  8. ** modify it under the terms of the GNU Library General Public
  9. ** License as published by the Free Software Foundation; either
  10. ** version 2 of the License, or (at your option) any later version.
  11. ** 
  12. ** This library is distributed in the hope that it will be useful,
  13. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15. ** Library General Public License for more details.
  16. ** 
  17. ** You should have received a copy of the GNU Library General Public
  18. ** License along with this library (see COPYING-LIB); if not, write to 
  19. ** the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, 
  20. ** USA.
  21. ** 
  22. **                            Written by
  23. **
  24. **                   Harald Winroth, Matti Rendahl
  25. **         Computational Vision and Active Perception Laboratory
  26. **            Royal Institute of Technology
  27. **              S-100 44 Stockholm
  28. **                Sweden
  29. **
  30. ** Report bugs to candela-bug@bion.kth.se, and direct all inquiries to 
  31. ** candela@bion.kth.se.
  32. **
  33. */
  34.  
  35. #ifndef _exception_exc_err_h
  36. #define _exception_exc_err_h
  37.  
  38. #include <stdarg.h>
  39.  
  40. /*
  41.  * excErr exception type
  42.  */
  43.  
  44. typedef struct _excErr
  45. {
  46.     struct _excErr *self;
  47.     struct _excErr *in_domain;
  48.     char *name;
  49.     char *str;
  50.  
  51. } excErr;
  52.  
  53. /* 
  54.  * Place-holder representing the excErr type 
  55.  */
  56.  
  57. typedef struct
  58. {
  59.     /* fatal should be the first entry here (for backward compatibility) */
  60.  
  61.     int fatal;    /* Handler will return non-zero status */
  62.     int nonfatal; /* Handler will return zero status */
  63.  
  64. } excErrType;
  65.  
  66. extern excErrType exc_err_type;
  67.  
  68. /* 
  69.  * exc_err_progname contains the program name if set, or "anonymous program". 
  70.  * It is set if exc_err_progname != exc_err_anonymous_program.
  71.  */
  72. extern char *exc_err_progname;
  73. extern char exc_err_anonymous_program[];
  74.  
  75. /* 
  76.  * Access functions for excErr exception variables
  77.  */
  78.  
  79. extern excErr *exc_err_domain (excErr *e);
  80. extern char *exc_err_name (excErr *e);
  81. extern char *exc_err_str (excErr *e);
  82. extern excErr *exc_err_top_domain (excErr *e);
  83. extern char *exc_err_package_name (excErr *e);
  84. extern char *exc_err_full_name (excErr *e);
  85.  
  86. /*
  87.  * Error message buffers
  88.  */
  89.  
  90. typedef enum
  91. {
  92.     excErrUnderline = 0,
  93.     excErrInverse,
  94.     excErrStandOut,
  95.  
  96.     excErrStr,
  97.     excErrTab,
  98.  
  99.     excErrNumFormatTags /* must be last */
  100.  
  101. } excErrFormatTag;
  102.  
  103. typedef union 
  104. {
  105.     char *str;
  106.     unsigned int col;
  107.     int on;
  108.  
  109. } excErrFormatArg;
  110.  
  111. typedef struct 
  112. {
  113.     excErrFormatTag tag;
  114.     excErrFormatArg arg;
  115.  
  116. } excErrFormat;
  117.  
  118. typedef enum
  119. {
  120.     excErrBufArgNone = 0,
  121.     excErrBufArgLeftDelimiters,
  122.     excErrBufArgRightDelimiters,
  123.     excErrBufArgWhitespace,
  124.     excErrBufArgWidth,
  125.     excErrBufArgMaxTab,
  126.     excErrBufArgAutoBreakChar
  127.  
  128. } excErrBufArg;
  129.  
  130. typedef struct
  131. {
  132.     char *left_delim;
  133.     char *right_delim;
  134.     char *whitespace;
  135.     char *auto_break_char;
  136.     unsigned int width;
  137.     unsigned int max_tab;
  138.  
  139.     char *str;
  140.     unsigned int str_len; /* str allocated length */
  141.     unsigned int str_pos; /* next free pos */
  142.  
  143.     unsigned int cur_tab;
  144.     unsigned int cur_col;
  145.  
  146.     excErrFormat *format;
  147.     unsigned int format_len; /* format allocated length */
  148.     unsigned int format_pos; /* next free pos */
  149.  
  150. } excErrBuf;
  151.  
  152. /*
  153.  * Iterators
  154.  */
  155.  
  156. #define _EXC_ERR_EVAL_1A(OP, F1, F2, ARGS) OP(F1, ARGS, _EXC_ERR_EVAL_1B)
  157. #define _EXC_ERR_EVAL_1B(OP, F1, F2, ARGS) OP(F1, ARGS, _EXC_ERR_EVAL_1A)
  158.  
  159. #define _EXC_ERR_EVAL_2A(OP, F1, F2, ARGS) OP(F2, ARGS, _EXC_ERR_EVAL_2B)
  160. #define _EXC_ERR_EVAL_2B(OP, F1, F2, ARGS) OP(F2, ARGS, _EXC_ERR_EVAL_2A)
  161.  
  162. #define _EXC_ERR_EVAL_1(FORMS) _EXC_ERR_EVAL_1A FORMS
  163. #define _EXC_ERR_EVAL_2(FORMS) _EXC_ERR_EVAL_2A FORMS
  164.  
  165. #define _EXC_ERR_APPLY(FUNC, ARGS, NEXT) FUNC ARGS NEXT
  166. #define _EXC_ERR_APPLY_STOP(FUNC, ARGS, NEXT) FUNC ARGS
  167.  
  168. /* 
  169.  * Primitive errors 
  170.  */
  171.  
  172. #define _EXC_ERR_DCL(DOMAIN, NAME, STR)                          \
  173.   excErr NAME ;
  174.  
  175. #define _EXC_ERR_DEF(DOMAIN, NAME, STR)                          \
  176.   { & DOMAIN . NAME , (excErr *) & DOMAIN, # NAME , STR },
  177.  
  178. #define EXC_ERR(DOMAIN, NAME, STR)                          \
  179.   (_EXC_ERR_APPLY, _EXC_ERR_DCL, _EXC_ERR_DEF, (DOMAIN, NAME, STR))
  180.  
  181. /* 
  182.  * Error domains 
  183.  */
  184.  
  185. #define _EXC_ERR_DOM_DCL1(DOMAIN, NAME)                          \
  186.   struct {                                      \
  187.       excErr domain;
  188.  
  189. #define _EXC_ERR_DOM_DCL2(NAME)                              \
  190.   } NAME ;
  191.  
  192. #define _EXC_ERR_DOM_DEF1(DOMAIN, NAME)                          \
  193.   {{ (excErr *) & DOMAIN . NAME, (excErr *) & DOMAIN, # NAME , 0 },
  194.  
  195. #define _EXC_ERR_DOM_DEF2(NAME)                              \
  196.   },
  197.  
  198. #define EXC_ERR_DOM(DOMAIN, NAME, REST)                          \
  199.   (_EXC_ERR_APPLY, _EXC_ERR_DOM_DCL1, _EXC_ERR_DOM_DEF1, (DOMAIN, NAME))      \
  200.   REST                                          \
  201.   (_EXC_ERR_APPLY, _EXC_ERR_DOM_DCL2, _EXC_ERR_DOM_DEF2, (NAME))
  202.  
  203. /*
  204.  * Top domains
  205.  */
  206.  
  207. #define _EXC_ERR_TYPE(NAME) excErrType_ ## NAME
  208.  
  209. #define _EXC_ERR_TOP_DOM_DCL1(NAME)                          \
  210.   typedef struct {                                  \
  211.       excErr domain;
  212.  
  213. #define _EXC_ERR_TOP_DOM_DCL2(NAME)                          \
  214.   } _EXC_ERR_TYPE(NAME);                              \
  215.   extern _EXC_ERR_TYPE(NAME) NAME
  216.  
  217. #define _EXC_ERR_TOP_DOM_DEF1(NAME)                          \
  218.   _EXC_ERR_TYPE(NAME) NAME = {{ (excErr *) & NAME, 0, # NAME , 0 },
  219.  
  220. #define _EXC_ERR_TOP_DOM_DEF2(NAME)                          \
  221.   }
  222.  
  223. #define _EXC_ERR_FORMS(NAME, REST)                          \
  224.   (_EXC_ERR_APPLY, _EXC_ERR_TOP_DOM_DCL1, _EXC_ERR_TOP_DOM_DEF1, (NAME))      \
  225.   REST                                          \
  226.   (_EXC_ERR_APPLY_STOP, _EXC_ERR_TOP_DOM_DCL2, _EXC_ERR_TOP_DOM_DEF2, (NAME))
  227.  
  228. /*
  229.  * Exported macros for declarations and definitions
  230.  */
  231.  
  232. #define EXC_ERR_DECLARE(NAME, REST) _EXC_ERR_EVAL_1(_EXC_ERR_FORMS(NAME, REST))
  233. #define EXC_ERR_DEFINE(NAME, REST)  _EXC_ERR_EVAL_2(_EXC_ERR_FORMS(NAME, REST))
  234.  
  235. /* This is redefined in exc-err-define.h */
  236. #define EXC_ERR_DESCRIPTION(NAME, REST) EXC_ERR_DECLARE(NAME, REST)
  237.  
  238. /* 
  239.  * Creating, destroying and clearing error message buffers 
  240.  */
  241.  
  242. extern excErrBuf *exc_err_buf_new (excErrBufArg first, ...);
  243. extern void exc_err_buf_delete (excErrBuf *buf);
  244. extern void exc_err_buf_clear (excErrBuf *buf);
  245.  
  246. /* 
  247.  * Formatting error message buffers 
  248.  */
  249.  
  250. extern void exc_err_buf_print (excErrBuf *buf, const char *str);
  251. extern void exc_err_buf_printf (excErrBuf *buf, const char *fmt, ...);
  252. extern void exc_err_buf_vprintf (excErrBuf *buf, const char *fmt, va_list l);
  253.  
  254. extern void exc_err_buf_print_indivis (excErrBuf *buf, const char *str);
  255. extern void exc_err_buf_printf_indivis (excErrBuf *buf, const char *fmt, ...);
  256. extern void exc_err_buf_vprintf_indivis (excErrBuf *buf, const char *fmt, 
  257.                      va_list l);
  258.  
  259. extern void exc_err_buf_print_buf (excErrBuf *buf, excErrBuf *src);
  260. extern void exc_err_buf_tab (excErrBuf *buf, unsigned int col);
  261. extern void exc_err_buf_underline (excErrBuf *buf, int on);
  262. extern void exc_err_buf_inverse (excErrBuf *buf, int on);
  263. extern void exc_err_buf_stand_out (excErrBuf *buf, int on);
  264.  
  265. /* 
  266.  * Access functions for excErrBuf 
  267.  */
  268.  
  269. extern char *exc_err_buf_str (excErrBuf *buf);
  270.  
  271. /* 
  272.  * Global error message buffer 
  273.  */
  274.  
  275. extern excErrBuf *exc_err_buf;
  276.  
  277. /* 
  278.  * Formatting the global exc_err_buf error message buffer (syntatic sugar) 
  279.  */
  280.  
  281. extern void exc_err_print (const char *str);
  282. extern void exc_err_printf (const char *fmt, ...);
  283. extern void exc_err_vprintf (const char *fmt, va_list l);
  284.  
  285. extern void exc_err_print_indivis (const char *str);
  286. extern void exc_err_printf_indivis (const char *fmt, ...);
  287. extern void exc_err_vprintf_indivis (const char *fmt, va_list l);
  288.  
  289. extern void exc_err_tab (unsigned int col);
  290. extern void exc_err_underline (int on);
  291. extern void exc_err_inverse (int on);
  292. extern void exc_err_stand_out (int on);
  293. extern void exc_err_clear (void);
  294.  
  295. /* 
  296.  * Single line error messages 
  297.  */
  298.  
  299. extern void exc_error (excErr e, const char *fmt, ...);
  300. extern void exc_verror (excErr e, const char *fmt, va_list l);
  301. extern void exc_perror (excErr e, const char *fmt, ...);
  302. extern void exc_vperror (excErr e, const char *fmt, va_list l);
  303.  
  304. /* 
  305.  * Throw excErr exceptions without adding text to the error message buffer
  306.  */
  307.  
  308. void exc_err_throw_fatal (excErr e);    /* exit code 1 */
  309. void exc_err_throw_nonfatal (excErr e); /* exit code 0 */
  310.  
  311. /* 
  312.  * Displaying messages (used by exc_err_handler) 
  313.  */
  314.  
  315. extern void (*exc_err_print_hook)(const char *str);
  316. extern void exc_err_builtin_print (const char *str);
  317.  
  318. /* 
  319.  * Default exception handler 
  320.  */
  321.  
  322. extern int exc_err_handler (void *e, void *e_type, void *h_data);
  323.  
  324. /* 
  325.  * Initialization 
  326.  */
  327.  
  328. extern void exc_err_init (void);
  329.  
  330. #endif /* !_exception_exc_err_h */
  331.